package grapid.database;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;

/**
 * 数据库连接管理类
 * 
 * @author grapid
 * @version 1.0
 * 
 */
public class GConnectionManager {

	/**
	 * 数据源
	 */
	private static DataSource dataSource = null;
	/**
	 * 数据源名称
	 */
	private static String DSName;
	/**
	 * 驱动
	 */
	private static String DBDriver;
	/**
	 * 链接
	 */
	private static String DBUrl;
	/**
	 * 数据库用户名
	 */
	private static String DBUname;
	/**
	 * 数据库密码
	 */
	private static String DBPassword;

	/**
	 * 初始化
	 * 
	 * @param dsName
	 *            数据源名称
	 * @param driver
	 *            驱动<br />
	 *            mssql: "net.sourceforge.jtds.jdbc.Driver"<br />
	 *            mysql: "com.mysql.jdbc.Driver"
	 * @param url
	 *            链接<br />
	 *            mssql: "jdbc:jtds:sqlserver://localhost:port/dbname"<br />
	 *            mysql:"jdbc:mysql://localhost:port/dbname?useUnicode=true&characterEncoding=utf8&autoReconnect=true"
	 * @param uname
	 *            数据库用户名
	 * @param password
	 *            数据库密码
	 */
	public static void setDataSource(String dsName, String driver, String url, String uname, String password) {
		DSName = dsName;
		DBDriver = driver;
		DBUrl = url;
		DBUname = uname;
		DBPassword = password;
		init();
	}

	/**
	 * 初始化
	 */
	private static void init() {
		if (DSName != null && !"".equals(DSName)) {
			try {
				Context context = new InitialContext();
				dataSource = (DataSource) context.lookup(DSName);
			} catch (Exception e) {
				System.out.println("获取数据源[" + DSName + "]失败，尝试直接使用jdbc连接...");
				dataSource = createBasicDataSource();
			}
		} else {
			dataSource = createBasicDataSource();
		}
	}

	/**
	 * 创建数据源
	 * 
	 * @return 数据源
	 */
	private static BasicDataSource createBasicDataSource() {
		BasicDataSource bds = new BasicDataSource();
		bds.setDriverClassName(DBDriver);
		bds.setUrl(DBUrl);
		bds.setUsername(DBUname);
		bds.setPassword(DBPassword);
		return bds;
	}

	/**
	 * 取Connection
	 * 
	 * @return 返回Connection连接
	 * @throws SQLException
	 */
	public static Connection getConnection() throws SQLException {
		if (dataSource == null)
			init();
		return dataSource.getConnection();
	}

	/**
	 * 可用于SQLite
	 * 
	 * @param driver
	 *            驱动
	 * @param url
	 *            链接
	 * @param uname
	 *            数据库用户名
	 * @param password
	 *            数据库密码
	 * @return 返回Connection连接
	 * @throws Exception
	 */
	public static Connection getConnection(String driver, String url, String uname, String password) throws Exception {
		// user 用户名
		// password 密码
		// autoReconnect 联机失败，是否重新联机（true/false）
		// maxReconnect 尝试重新联机次数
		// initialTimeout 尝试重新联机间隔
		// maxRows 传回最大行数
		// useUnicode 是否使用Unicode字体编码（true/false）
		// characterEncoding 何种编码（GB2312/UTF-8/…）
		// relaxAutocommit 是否自动提交（true/false）
		// capitalizeTypeNames 数据定义的名称以大写表示
		Class.forName(driver);
		if (uname == null || password == null)
			return DriverManager.getConnection(url);
		return DriverManager.getConnection(url, uname, password);
	}
}
